#Boa:Dialog:Compras

import wx
import wx.calendar
import wx.grid
import consultasBD
import Altaproductos
import Buscacolor2
import BuscaProveedor
import BuscaProdPorDescri
import consultasBD
import utiles
import sincronizar_tabla  

import Compras

def create(parent):
    return ComprasModificar(parent)

[wxID_COMPRAS, 
 wxID_COMPRASBUTTON3, 
 wxID_COMPRASGRID1, 
 wxID_COMPRASINCANTIDADES, 
 wxID_COMPRASINFECHAFACTURA, 
 wxID_COMPRASINFECHAINGRESO, 
 wxID_COMPRASINIVA, 
 wxID_COMPRASINNOMBREPROVEE, 
 wxID_COMPRASINPROVEEDOR, 
 wxID_COMPRASINSUBTOTAL, 
 wxID_COMPRASINTOTAL, 
 wxID_COMPRASNRO_FACTURA, 
 wxID_COMPRASSPINBUTTON1, 
 wxID_COMPRASSTATICLINE1, 
 wxID_COMPRASSTATICLINE2, 
 wxID_COMPRASSTATICLINE3, 
 wxID_COMPRASSTATICLINE4, 
 wxID_COMPRASSTATICTEXT1, 
 wxID_COMPRASSTATICTEXT10, 
 wxID_COMPRASSTATICTEXT2, 
 wxID_COMPRASSTATICTEXT3, 
 wxID_COMPRASSTATICTEXT5, 
 wxID_COMPRASSTATICTEXT6, 
 wxID_COMPRASSTATICTEXT7,
 wxID_COMPRASTOTALTOTAL,
 wxID_COMPRASSTATICTEXT8,wxID_COMPRASRADIOBOX1,
] = [wx.NewId() for _init_ctrls in range(27)]

class ComprasModificar(Compras.Compras):
    modificables = ()
    
    def _init_ctrls(self, prnt):
        # generated method, don't edit
        wx.Dialog.__init__(self, id=wxID_COMPRAS, name='', parent=prnt,
              pos=wx.Point(353, 110), size=wx.Size(727, 551),
              style=wx.DEFAULT_DIALOG_STYLE, title='Listado de Compras')
        self.SetClientSize(wx.Size(719, 517))

        self.staticText1 = wx.StaticText(id=wxID_COMPRASSTATICTEXT1,
              label='Fecha de Ingreso:', name='staticText1', parent=self,
              pos=wx.Point(8, 8), size=wx.Size(89, 13), style=0)

        self.staticText2 = wx.StaticText(id=wxID_COMPRASSTATICTEXT2,
              label='Fecha Factura:', name='staticText2', parent=self,
              pos=wx.Point(24, 40), size=wx.Size(74, 13), style=0)
    
        self.staticText3 = wx.StaticText(id=wxID_COMPRASSTATICTEXT3,
              label='Proveedor:', name='staticText3', parent=self,
              pos=wx.Point(312, 8), size=wx.Size(55, 13), style=0)

        self.staticLine1 = wx.StaticLine(id=wxID_COMPRASSTATICLINE1,
              name='staticLine1', parent=self, pos=wx.Point(1, 96),
              size=wx.Size(711, 4), style=0)

        self.staticLine2 = wx.StaticLine(id=wxID_COMPRASSTATICLINE2,
              name='staticLine2', parent=self, pos=wx.Point(368, 112),
              size=wx.Size(1, 2), style=0)

        self.staticLine3 = wx.StaticLine(id=wxID_COMPRASSTATICLINE3,
              name='staticLine3', parent=self, pos=wx.Point(368, 112),
              size=wx.Size(1, 2), style=0)

        self.staticLine4 = wx.StaticLine(id=wxID_COMPRASSTATICLINE4,
              name='staticLine4', parent=self, pos=wx.Point(256, 0),
              size=wx.Size(8, 96), style=0)

        self.grid1 = wx.grid.Grid(id=wxID_COMPRASGRID1, name='grid1',
              parent=self, pos=wx.Point(8, 112), size=wx.Size(704, 304),
              style=0)
        self.grid1.Bind(wx.grid.EVT_GRID_CELL_CHANGE,
              self.OnGrid1GridCellChange)

        self.staticText5 = wx.StaticText(id=wxID_COMPRASSTATICTEXT5,
              label='Cant. Art. Ingresados:', name='staticText5', parent=self,
              pos=wx.Point(200, 424), size=wx.Size(111, 13), style=0)

        self.incantidades = wx.TextCtrl(id=wxID_COMPRASINCANTIDADES,
              name='incantidades', parent=self, pos=wx.Point(320, 424),
              size=wx.Size(100, 21), style=0, value='')
        self.incantidades.Enable(True)
        self.incantidades.SetEditable(False)

        self.staticText6 = wx.StaticText(id=wxID_COMPRASSTATICTEXT6,
              label='Sub-Total Iva Discriminado:', name='staticText6',
              parent=self, pos=wx.Point(464, 424), size=wx.Size(132, 16),
              style=0)

        self.insubtotal = wx.TextCtrl(id=wxID_COMPRASINSUBTOTAL,
              name='insubtotal', parent=self, pos=wx.Point(608, 424),
              size=wx.Size(100, 21), style=0, value='')
        self.insubtotal.Enable(True)
        self.insubtotal.SetEditable(False)

        self.staticText7 = wx.StaticText(id=wxID_COMPRASSTATICTEXT7,
              label='Total:', name='staticText7', parent=self, pos=wx.Point(568,
              472), size=wx.Size(29, 13), style=0)

        self.intotal = wx.TextCtrl(id=wxID_COMPRASINTOTAL, name='intotal',
              parent=self, pos=wx.Point(608, 472), size=wx.Size(100, 21),
              style=0, value='')
        self.intotal.SetFont(wx.Font(8, wx.SWISS, wx.NORMAL, wx.BOLD, False,
              'Tahoma'))
        self.intotal.SetEditable(False)

        self.staticText8 = wx.StaticText(id=wxID_COMPRASSTATICTEXT8,
              label='Iva:', name='staticText8', parent=self, pos=wx.Point(576,
              448), size=wx.Size(21, 13), style=0)

        self.iniva = wx.TextCtrl(id=wxID_COMPRASINIVA, name='iniva',
              parent=self, pos=wx.Point(608, 448), size=wx.Size(100, 21),
              style=0, value='')
        self.iniva.SetEditable(False)

        self.inNombreProvee = wx.TextCtrl(id=wxID_COMPRASINNOMBREPROVEE,
              name='inNombreProvee', parent=self, pos=wx.Point(496, 8),
              size=wx.Size(216, 21), style=0, value='')
        self.inNombreProvee.SetEditable(False)

        self.infechaingreso = wx.DatePickerCtrl(id=wxID_COMPRASINFECHAINGRESO,
              name='infechaingreso', parent=self, pos=wx.Point(112, 8),
              size=wx.Size(96, 21), style=0)
        self.infechaingreso.Enable(False)
        

        self.infechafactura = wx.DatePickerCtrl(id=wxID_COMPRASINFECHAFACTURA,
              name='infechafactura', parent=self, pos=wx.Point(112, 40),
              size=wx.Size(96, 21), style=wx.DP_DROPDOWN | wx.DP_SHOWCENTURY)

        self.staticText10 = wx.StaticText(id=wxID_COMPRASSTATICTEXT10,
              label=u'N\xba Factura:', name='staticText10', parent=self,
              pos=wx.Point(32, 72), size=wx.Size(56, 13), style=0)

        self.nro_factura = wx.TextCtrl(id=wxID_COMPRASNRO_FACTURA,
              name=u'nro_factura', parent=self, pos=wx.Point(112, 70),
              size=wx.Size(96, 21), style=0, value=u'')
        self.nro_factura.Bind(wx.EVT_KILL_FOCUS, self.OnNro_facturaKillFocus)

        self.button3 = wx.Button(id=wxID_COMPRASBUTTON3,
              label=u'Imprimir Etiquetas', name='button3', parent=self,
              pos=wx.Point(200, 472), size=wx.Size(112, 31), style=0)
        self.button3.Bind(wx.EVT_BUTTON, self.OnImprimirButton,
              id=wxID_COMPRASBUTTON3)

        self.inproveedor = wx.TextCtrl(id=wxID_COMPRASINPROVEEDOR,
              name='inproveedor', parent=self, pos=wx.Point(376, 8),
              size=wx.Size(100, 21), style=0, value='')
        self.inproveedor.SetEditable(False)
#        self.inproveedor.Bind(wx.EVT_KILL_FOCUS, self.OnInproveedorKillFocus)

        self.spinButton1 = wx.SpinButton(id=wxID_COMPRASSPINBUTTON1,
              name='spinButton1', parent=self, pos=wx.Point(376, 72),
              size=wx.Size(112, 17), style=wx.SP_HORIZONTAL)
        self.spinButton1.Bind(wx.EVT_SPIN_UP, self.OnSpinUp,
              id=wxID_COMPRASSPINBUTTON1)
        self.spinButton1.Bind(wx.EVT_SPIN_DOWN, self.OnSpinDown,
              id=wxID_COMPRASSPINBUTTON1)

        self.totaltotal = wx.TextCtrl(id=wxID_COMPRASTOTALTOTAL,
              name='totaltotal', parent=self, pos=wx.Point(608, 472),
              size=wx.Size(64, 21), style=0, value='0.0')
        self.totaltotal.SetEditable(False)
        
        self.radioBox1 = wx.RadioBox(choices=['En 1', 'En 2'],
              id=wxID_COMPRASRADIOBOX1, label='envia x correo:',
              majorDimension=1, name='radioBox1', parent=self, pos=wx.Point(472,
              328), size=wx.Size(88, 64), style=wx.RA_SPECIFY_COLS)
        self.radioBox1.Bind(wx.EVT_RADIOBOX, self.OnRadioBox1Radiobox,
              id=wxID_COMPRASRADIOBOX1)
        
    def __init__(self, parent):
        self._init_ctrls(parent)
        self.padre = parent
        self.sucursal = self.padre.sucursalNro
        
        self.cantidad_facturas = self._cantidad_facturas()
        self.id_factura = None
        self.orden_factura = 0

        #self.grillafactura()
        self._cargar_factura(self.orden_factura)    

    def _cantidad_facturas(self):
        sql = "SELECT count(*) as cantidad FROM compras"
        resultados = consultasBD.ordenCrudaDict(sql)
        return resultados[0]['cantidad']

    def _limpiar_grilla(self):
        for col in range(9):
            for fil in range(60):
                self.grid1.SetCellValue(fil, col, "")
                
    def _es_antigua(self, id_factura):
        sql = "SELECT DATEDIFF( SYSDATE( ) , fechaingreso ) as dias FROM compras WHERE idfactura = '%s'" % id_factura
        resultado = consultasBD.ordenCrudaResultDict(sql)
        if int(resultado['dias']) > 1:
            return True
        return False
    
    def _habilitar(self):
        for x in self.GetChildren():
            x.Enable()
        self.infechaingreso.Disable()
                    
    def _deshabilitar(self):
        for x in self.GetChildren():
            x.Disable()            
        self.nro_factura.Enable()
        self.spinButton1.Enable()
    
    def _cargar_factura(self, orden_factura):
        sql_ultima = "  SELECT *, fechaingreso, fechafactura FROM compras c JOIN proveedor p ON c.idproveedor = p.idproveedor ORDER BY fechaingreso DESC, idfactura DESC "
        resultados = consultasBD.ordenCrudaDict(sql_ultima)
        factura = resultados[int(orden_factura)]
        self.nro_factura.ChangeValue(str(factura['idfactura']))
        self.inproveedor.ChangeValue(str(factura['idproveedor']))
        self.inNombreProvee.ChangeValue(str(factura['nombre']))
                
        utiles.cargar_fecha(factura['fechaingreso'], self.infechaingreso)

        self.id_factura = factura['idfactura']
        
        self._limpiar_grilla()
        
        sql_items = "SELECT * FROM compras_items c JOIN productos p ON c.codsussan = p.codsussan WHERE c.idfactura = '%s'" % factura['idfactura']
        print sql_items
        items = consultasBD.ordenCrudaDict(sql_items)
        for i, item in enumerate(items):
            self.grid1.SetCellValue(i, 0, str(item['codsussan']))
            self.grid1.SetCellValue(i, 1, str(item['codsussan']))
            self.grid1.SetCellValue(i, 2, str(item['descri']))
            self.grid1.SetCellValue(i, 3, str(item['cantidad']))
            self.grid1.SetCellValue(i, 3, str(item['cantidad']))
            self.grid1.SetCellValue(i, 4, str(item['talle']))
            self.grid1.SetCellValue(i, 5, str(item['color']))
            self.grid1.SetCellValue(i, 6, str(item['costounidad']))
            total = item['costounidad'] * item['cantidad']
            self.grid1.SetCellValue(i, 8, str(total))
            
        self.actualizaSubtotal() 
        
        self._habilitar()
##        if self._es_antigua(self.id_factura):
##            self._deshabilitar()                          
                
    def _borrar_stock(self, idfactura):
        '''Descuenta el stock que agregan los items de la factura'''
        sql_items = "SELECT ptc.id as ptc, cantidad FROM compras_items ci JOIN producto_talle_color ptc ON(ci.codsussan = ptc.codsussan AND ci.talle = ptc.talle AND ci.color = ptc.color) WHERE ci.idfactura = '%s'" % (idfactura)
        resultados = consultasBD.ordenCrudaDict(sql_items)
        sucursal = self.sucursal
        for item in resultados:
            stock = utiles.stock_sumado(str(item['ptc']), self.sucursal, -item['cantidad'])
            sql_change = "UPDATE stock SET stock = '%s' WHERE ptc = '%s' AND sucursal = '%s'" % (stock, item['ptc'], self.sucursal)                
            sincronizar_tabla.addChange(sql=sql_change)
            consultasBD.executaSinCommit(None, sql_change)                   

    def _borrar_items(self, idfactura):
        sql_borrar = "DELETE FROM compras_items WHERE idfactura = '%s'" % idfactura
        consultasBD.executaSinCommit(None, sql_borrar)        

    def _modificar_factura(self, idfactura):
        cantprendas   = self._cantidad_de_prendas()
        en1oen2       = int(self.tipo_compra.GetSelection()) + 1
        subtotal      = self.iniva.Value   
        iva           = self.insubtotal.Value
        total         = self.intotal.Value
        fechafactura  = utiles.formatear_fecha_date(self.infechafactura.Value)
        
        sql_modificar = "UPDATE compras SET cantprendas = '%s', en1oen2 = '%s', subtotal = '%s', iva = '%s', total = '%s', fechafactura = '%s' WHERE idfactura = '%s'" % (cantprendas, en1oen2, subtotal, iva, total, fechafactura, idfactura)
        consultasBD.executaSinCommit(None, sql_modificar)

    def _orden_factura(self, id_factura):
        consultasBD.executa(None, "SET @row = -1")
        sql = "SELECT * FROM ( SELECT c.*, @row := @row + 1 AS fila FROM compras c JOIN proveedor p ON c.idproveedor = p.idproveedor ORDER BY c.fechaingreso DESC, c.idfactura DESC ) as m WHERE m.idfactura = '%s'" % id_factura
                
        resultados = consultasBD.ordenCrudaDict(sql, "SET @row = -1")        
        
        if len(resultados) == 0:
            print "FACTURA NO ENCONTRADA"
            mensaje = wx.MessageDialog(self, "Factura No Encontrada", "Error", style=wx.OK,pos = wx.DefaultPosition)
            mensaje.ShowModal()            
            return 0
        else:
            return resultados[0]['fila']
        
    def OnButton2Button(self, event):          
        if not self._validar_guardar():
            return
       
        try:
            self._modificar_factura(self.id_factura)
            
            self._borrar_stock(self.id_factura)
            self._agregar_stock()
            
            self._borrar_items(self.id_factura)
            self._agregar_items(self.id_factura)
            consultasBD.commit()
            sincronizar_tabla.syncServerTables(self, ["productos", "producto_talle_color", "stock"])
            
            utiles.mensaje(self, "La compra se guardo correctamente")            
            
            self.Close()

        except sincronizar_tabla.SyncError:
            utiles.mensaje(self, "La compra se guardo \n pero no termino de transmitirse por favor realize un sincronizacion")    
        except:
            utiles.mensaje(self, "NO se pudo guardar la compra")    
            consultasBD.rollback()                  

    def OnSpinUp(self, event):
        self.orden_factura -= 1
        if self.orden_factura < 0:
            self.orden_factura = self.cantidad_facturas - 1
        
        self._cargar_factura(self.orden_factura)
        event.Skip()

    def OnSpinDown(self, event):
        self.orden_factura = (self.orden_factura + 1) % self.cantidad_facturas
        self._cargar_factura(self.orden_factura)
        event.Skip()
    
    def OnNro_facturaKillFocus(self, event):
        self.orden_factura = self._orden_factura(self.nro_factura.Value)
        print "OOOORRRRRDDDDEEEEENNNN", self.orden_factura
        
        self._cargar_factura(self.orden_factura)
        event.Skip()        
